1 package edu.jiangxin.apktoolbox.convert.color.colorspace; 2 3 import java.awt.color.ColorSpace; 4 import java.io.Serial; 5 6 public class CmykColorSpace extends ColorSpace { 7 @Serial 8 private static final long serialVersionUID = 1L; 9 10 protected CmykColorSpace(int type, int numComponents) { 11 super(type, numComponents); 12 } 13 14 public static CmykColorSpace getInstance() { 15 return Holder.INSTANCE; 16 } 17 18 @Override 19 public float[] toRGB(float[] colorvalue) { 20 float c = colorvalue[0]; 21 float m = colorvalue[1]; 22 float y = colorvalue[2]; 23 float k = colorvalue[3]; 24 25 float r = 1 - Math.min(1, c * (1 - k) + k); 26 float g = 1 - Math.min(1, m * (1 - k) + k); 27 float b = 1 - Math.min(1, y * (1 - k) + k); 28 29 return new float[]{r, g, b}; 30 } 31 32 @Override 33 public float[] fromRGB(float[] rgbvalue) { 34 float r = rgbvalue[0]; 35 float g = rgbvalue[1]; 36 float b = rgbvalue[2]; 37 38 float k = 1 - Math.max(r, Math.max(g, b)); 39 float c = (1 - r - k) / (1 - k); 40 float m = (1 - g - k) / (1 - k); 41 float y = (1 - b - k) / (1 - k); 42 43 return new float[]{c, m, y, k}; 44 } 45 46 @Override 47 public float[] toCIEXYZ(float[] colorvalue) { 48 float[] rgb = toRGB(colorvalue); 49 return ColorSpace.getInstance(CS_sRGB).toCIEXYZ(rgb); 50 } 51 52 @Override 53 public float[] fromCIEXYZ(float[] colorvalue) { 54 float[] rgb = ColorSpace.getInstance(CS_sRGB).fromCIEXYZ(colorvalue); 55 return fromRGB(rgb); 56 } 57 58 private static class Holder { 59 private static final CmykColorSpace INSTANCE = new CmykColorSpace(TYPE_CMYK, 4); 60 } 61 }